﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Core.Business.Domain.Repository;
using Moq;
using Core.Business.Domain.Entities;

namespace ControleFinanceiro.Tests._2.Funcionais {
    [TestClass]
    public class LancamentoTest {
        private ILancamentoRepository _lancamentoRepository;
        public IContaRepository _contaRepository;

        [TestInitialize]
        public void Initialize() {
            var contaRepositoryMock = new Mock<IContaRepository>();
            contaRepositoryMock.Setup(m => m.GetContaBy(1))
                               .Returns(GetConta());
            _contaRepository = contaRepositoryMock.Object;

            var lancamentoRepositoryMock = new Mock<ILancamentoRepository>();
            lancamentoRepositoryMock.Setup(m => m.GetBy(1))
                                    .Returns(GetLancamento());
            _lancamentoRepository = lancamentoRepositoryMock.Object;
        }

        [TestCleanup]
        public void Cleanup() {

        }

        [TestMethod]
        public void O_usuario_deve_alterar_editar_deletar_um_lancamento() {
            var lancamento = _lancamentoRepository.GetBy(1);

            //ALTERANDO UM LANCAMENTO
            lancamento.SetValor(10);

            //DELETANDO UM LANCAMENTO
            lancamento = null;


        }

        [TestMethod]
        public void Deve_fazer_um_agendamento_de_3_vezes() {
            int totalParcelas = 3;
            var inicio = DateTime.Now;
            var tipo = TipoLancamento.SAQUE;
            var valor = 10;
            var favorecido = new Favorecido("jose");
            var comentario = "ok";

            var conta = _contaRepository.GetContaBy(1);
            conta.AddAgendamento(totalParcelas, comentario, inicio, tipo, favorecido, valor, Frequencia.MENSAL);

            conta.Lancamentos.ToList().ForEach(delegate(Lancamento l) {
                Console.WriteLine("Parcela: {0} - Total: {1} - Data: {2}", l.Parcela.Atual, l.Parcela.Total, l.Vencimento.ToShortDateString());
            });

            Assert.IsTrue(conta.Lancamentos.Count == totalParcelas);
        }

        private Conta GetConta() {
            var conta = new Corrente("Conta Santander", "Santander");

            return conta;
        }

        public Lancamento GetLancamento(){
            return new Saque(10, "Soloqui", new Favorecido("Soloqui"), TipoSituacao.ABERTO, DateTime.Now.AddDays(2), new Parcela(1, 1));
        }
    }
}
